{-
 Copyright 2022-23, Juspay India Pvt Ltd

 This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License

 as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program

 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY

 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of

 the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
-}

module Storage.CachedQueries.PartnerOrganization
  ( findByApiKeyHash,
  )
where

import Domain.Types.PartnerOrganization
import Kernel.Beam.Functions
import Kernel.External.Encryption (DbHash)
import Kernel.Prelude
import qualified Kernel.Storage.Hedis as Hedis
import Kernel.Utils.Common
import qualified Storage.Beam.PartnerOrganization as Beam
import qualified Storage.Queries.PartnerOrganization as Queries

findByApiKeyHash :: (CacheFlow m r, EsqDBFlow m r, MonadFlow m) => DbHash -> m (Maybe PartnerOrganization)
findByApiKeyHash apiKeyHash = do
  let key = makeApiKeyHashKey apiKeyHash
  Hedis.safeGet key >>= \case
    Just (a :: Beam.PartnerOrganization) -> fromTType' a
    Nothing -> findAndCache
  where
    findAndCache = flip whenJust cachePartnerOrganizationByApiKey /=<< Queries.findByApiKeyHash apiKeyHash

makeApiKeyHashKey :: DbHash -> Text
makeApiKeyHashKey apiKeyHash = "CachedQueries:PartnerOrganization:ApiKeyHash:" <> show apiKeyHash

cachePartnerOrganizationByApiKey :: (CacheFlow m r) => PartnerOrganization -> m ()
cachePartnerOrganizationByApiKey pOrg = do
  expTime <- fromIntegral <$> asks (.cacheConfig.configsExpTime)
  let key = makeApiKeyHashKey pOrg.apiKey.hash
  let beamType = toTType' pOrg
  Hedis.setExp key beamType expTime
